module Gateway (Gateway, nuevoG, numeroG, triviasG, comandosG,
	agregarTriviaG, procesarComandoG, procesarMensajeG, seAnotanEnTodasG)

where

import Tipos
import SMS
import Trivia


import Pregunta


data Gateway = CrearG Numero [Keyword] | AgregarTrivia Trivia Gateway deriving (Show)


-- Testing --

triviaEj = Jugar 12345 "Sarasa Interesantes" (
           Jugar 12345 "Sarasa Intersantes" (
           Jugar 678 "Sarasa Espectaculares" (
           Jugar 91011 "Sarasa Espectaculares" (
           Jugar 91011 "Sarasa Oficialistas" (
           Jugar 678 "Sarasa Gordas" (
           Jugar 678 "Sarasa Oficialistas" (
           Jugar 91011 "Sarasa Espectaculares" (
           Jugar 678 "Sarasa Grandes" (
           Jugar 12345 "Sarasa Gordas" (
           Jugar 678 "Sarasa" (
           Jugar 91011 "Sarasa" (
           Jugar 12345 "Sarasa" (
                CrearT ["Sarasa","Sarala"] [(nuevaP "Como tiene las tetas tu vieja?" "Grandes" 1000), 
                                            (nuevaP "Como tiene las tetas tu abuela?" "Enormes" 100), 
                                            (nuevaP "Como tiene las tetas tu nuera?" "Interesantes" 10)]
          ))))))))))))) {-Acuerdense de agregar parentesis cada vez que agregan un jugar nuevo.-}
           
      
triviaEj2 = Jugar 678 "Algo1 Berlin" (
            Jugar 12345 "Algo1 Berlin"(
            Jugar 5 "Algo1 No"(
            Jugar 5 "Chamuyo 4 "(
            Jugar 5 "Algo1"(
            Jugar 4 "Algo1"(
            Jugar 3 "Chamuyo Para mi si"(
            Jugar 3 "Algo1 15"(
            Jugar 3 "Algo1"(
            Jugar 2 "Chamuyo Muchas Boludeces"(
            Jugar 1 "Algo1 Boludeces"(
            Jugar 1 "Algo1 No"(
            Jugar 2 "Algo1 Si"(
            Jugar 1 "Chamuyo 4"(
            Jugar 2 "Chamuyo 25"(
            Jugar 1 "Algo1"(
            Jugar 2 "Chamuyo"(
                CrearT ["Chamuyo","Algo1"] [(nuevaP "2+2?" "4" 25),
                                            (nuevaP "Miento?" "No" 25),
                                            (nuevaP "Capital de Alemania?" "Berlin" 25),
                                            (nuevaP "Independencia?" "1816" 25)]
           ))))))))))))))))) {-Acuerdense de agregar parentesis cada vez que agregan un jugar nuevo.-}
            
gatewayEj = AgregarTrivia triviaEj (AgregarTrivia triviaEj2 (CrearG 999 ["BAJA","RANKING","HUEVO"]))

triviagatuna = (nuevaT ["Algo1","Chamuyo"] 
                                        [(nuevaP "2+2?" "4" 100),
                                         (nuevaP "Capital de Alemania?" "Berlin" 100),
                                         (nuevaP "Independencia?" "1816" 100)])
triviagatunera = (Jugar 1 "Sarasa" 
                                (nuevaT ["Sarasa","Sarala"] 
                                        [(nuevaP "Vieja?" "Grandes" 100),
                                         (nuevaP "Abuela?" "Enormes" 100),
                                         (nuevaP "Nuera?" "Interesantes" 100)]))

gatoej = AgregarTrivia triviagatunera (AgregarTrivia triviagatuna (CrearG 123 ["BAJA","RANKING"])) 
                                         


smsEj = nuevoSMS 999 "BAJA Sarasa"
-- Fin testing --

-- Funciones generales --  

nuevoG :: Numero -> [Keyword] -> Gateway
nuevoG numero keywords = CrearG numero keywords

numeroG :: Gateway -> Numero
numeroG (CrearG numero _) = numero
numeroG (AgregarTrivia _ gateway) = numeroG gateway

triviasG :: Gateway -> [Trivia]
triviasG (CrearG n ks) = []
triviasG (AgregarTrivia trivia gateway) = trivia : (triviasG gateway)

comandosG :: Gateway -> [Keyword]
comandosG (CrearG _ keywords) = keywords
comandosG (AgregarTrivia _ gateway) = comandosG gateway

agregarTriviaG :: Trivia -> Gateway -> Gateway
agregarTriviaG trivia gateway = AgregarTrivia trivia gateway

-- Fin funciones generales -- 

-- ProcesarComandoG -- 

procesarComandoG :: Gateway -> Usuario -> SMS -> (Gateway,SMS)
procesarComandoG gateway usuario sms | not(esComando (textoSMS sms) gateway) =
	(gateway,(nuevoSMS usuario "No te entiendo"))
                                     | not(encuentraTriviaAdecuada
	(textoSMS sms) gateway usuario) = (gateway,(nuevoSMS usuario "No te entiendo"))
                                     | damePalabra (textoSMS sms) == "RANKING" =
	(gateway,(nuevoSMS usuario (mensajeRanking (textoSMS sms) gateway usuario)))
                                     | damePalabra (textoSMS sms) == "BAJA" =
	(gatewayBaja gateway usuario (textoSMS sms),
	(nuevoSMS usuario "Listo, ya te borramos"))
                                     
esComando :: String -> Gateway -> Bool
esComando texto gateway = (damePalabra texto) `elem` (comandosG gateway) &&
	(damePalabra texto) `elem` ["BAJA","RANKING"]

encuentraTriviaAdecuada :: String -> Gateway -> Usuario -> Bool
encuentraTriviaAdecuada _ (CrearG _ _) _ = False
encuentraTriviaAdecuada texto (AgregarTrivia trivia gateway) usuario =
	((segundaPalabra texto) `elem` (keywordsT trivia) &&
		(usuario `elem` (participantesT trivia)))
	|| encuentraTriviaAdecuada texto gateway usuario

mensajeRanking :: String -> Gateway -> Usuario -> String
mensajeRanking texto gateway usuario = "Tu posicion es: " ++ 
	intToString (posicionEnT (dameTrivia (segundaPalabra texto) gateway) usuario)

dameTrivia :: String -> Gateway -> Trivia
dameTrivia keyword (AgregarTrivia trivia gateway)
	| keyword `elem` keywordsT (trivia) = trivia
	| otherwise = dameTrivia keyword gateway

gatewayBaja :: Gateway -> Usuario -> String -> Gateway
gatewayBaja (CrearG numero keywords) _ _ = CrearG numero keywords
gatewayBaja (AgregarTrivia trivia gateway) usuario texto
	| ((segundaPalabra texto) `elem` (keywordsT trivia)) =
		(AgregarTrivia (desregistrarJugadorT trivia usuario) gateway)
	| otherwise = AgregarTrivia trivia (gatewayBaja gateway usuario texto)
                                                                                                                 
-- Fin ProcesarComandoG -- 

-- ProcesarMensajeG -- 

procesarMensajeG :: Gateway -> Usuario -> SMS -> (Gateway,SMS)
procesarMensajeG gateway usuario sms | not(esKeyword (textoSMS sms) gateway) =
	(gateway, nuevoSMS usuario "No te entiendo")
                                     | otherwise =
	(nuevaGwConJugador (textoSMS sms) usuario gateway,
		respuestaAUsuario gateway usuario sms)

buscarTrivia :: SMS -> Gateway -> Trivia
buscarTrivia sms gateway = dameTrivia (damePalabra (textoSMS sms)) gateway

respuestaAUsuario :: Gateway -> Usuario -> SMS -> SMS
respuestaAUsuario gateway usuario sms = snd (componerTrivia
	(buscarTrivia sms gateway) usuario (textoSMS sms))
                                                                         
esKeyword :: Texto -> Gateway -> Bool
esKeyword texto (CrearG numero keywords) = False
esKeyword texto (AgregarTrivia trivia gateway) =
	(damePalabra texto) `elem` (keywordsT trivia) || esKeyword texto gateway

esNuevo :: Trivia -> Usuario -> Bool
esNuevo trivia usuario = not (elem usuario (participantesT trivia))  

nuevaGwConJugador :: Texto -> Usuario -> Gateway -> Gateway
nuevaGwConJugador _ _ (CrearG id keywords) = CrearG id keywords
nuevaGwConJugador texto usuario (AgregarTrivia trivia gateway) |
	(damePalabra texto) `elem` (keywordsT trivia) =
		AgregarTrivia (fst(componerTrivia trivia usuario texto)) gateway
                                                               |
	otherwise = AgregarTrivia trivia (nuevaGwConJugador texto usuario gateway)
                                                               
componerTrivia :: Trivia -> Usuario -> Texto -> (Trivia,SMS)
componerTrivia trivia usuario texto | esNuevo trivia usuario =
	registrarJugadorT trivia usuario texto
                                    | otherwise =
	procesarRespuestaT trivia usuario texto
                                                                                              
-- Fin ProcesarMensajeG -- 

-- SeAnotanEnTodasG -- 

seAnotanEnTodasG:: Gateway -> [Usuario]
seAnotanEnTodasG gateway = sacarRepetidos (participanEnTodas
	(ganadoresDeTodasLasTrivias gateway) gateway)

participanEnTodas:: [Usuario] -> Gateway -> [Usuario]
participanEnTodas [] _ = []
participanEnTodas (usuario:us) gateway | esParticipanteDeTodasLasTrivias usuario gateway =
	usuario : (participanEnTodas us gateway)
                                       | otherwise =
	participanEnTodas us gateway

esParticipanteDeTodasLasTrivias:: Usuario -> Gateway -> Bool
esParticipanteDeTodasLasTrivias usuario (CrearG numero keywords) = True
esParticipanteDeTodasLasTrivias usuario (AgregarTrivia trivia gateway) =
	usuario `elem` (participantesT trivia) &&
		(esParticipanteDeTodasLasTrivias usuario gateway)

ganadoresDeTodasLasTrivias:: Gateway -> [Usuario]
ganadoresDeTodasLasTrivias (CrearG numero keywords) = []
ganadoresDeTodasLasTrivias (AgregarTrivia trivia gateway) =
	(ganadoresT trivia) ++ (ganadoresDeTodasLasTrivias gateway)
                                                                                                                
-- Fin SeAnotanEnTodasG -- 
